package Busquedas;

import Estados.Estado;
import Juegos.Juego;
import java.util.ArrayList;

/**
 * Clase para implementar la b�squeda de primero en anchura.
 * Extiende de la clase B�squeda.
 
 */
public class PrimeroAnchura extends Busqueda {
    ArrayList<Estado> expandidos;
    ArrayList<Estado> pilaAbiertos;
    private long tiempoTotal;
    private int contadorNodos;

    public PrimeroAnchura(Estado ini, Juego juego){
                super(ini,juego);
                this.expandidos=new ArrayList<Estado>();
                this.pilaAbiertos=new ArrayList<Estado>();
                this.pilaAbiertos.add(ini);
                contadorNodos = 0;
    }
	

    public ArrayList<Estado> resolver(){
        long tiempo1=System.currentTimeMillis();
	boolean solucion = false;
        while (!solucion && this.pilaAbiertos.size()!=0){
            Estado e=this.pilaAbiertos.remove(0);
            if(juego.esFinal(e)){
                solucionar(e);
                solucion=true;
            }else{
                generaHijos(e);
            }
            long tiempo2=System.currentTimeMillis();
            tiempoTotal = tiempoTotal + (tiempo2 - tiempo1);
        }
        return this.solucion;
   }
	
    private boolean estaExpandido(Estado e){
        for(int i=0;i<this.expandidos.size();i++){
            if(e.Iguales(e, this.expandidos.get(i)))
                return true;
        }
        return false;


    }

    private void generaHijos(Estado e){
        this.expandidos.add(e);
        int ops=this.juego.getNumOperadores();
        for(int i=0; i<ops; i++){
            Estado nuevo=this.juego.operar(i,e);
            //control de ciclos y de estado peligro
            if( nuevo!=null && !estaExpandido(nuevo) && !juego.esPeligro(nuevo))
                this.pilaAbiertos.add(contadorNodos, nuevo);
                contadorNodos++;
        }
    }
	
	
	
}
